﻿#region
//Copyright (c) 2016-2022 北京网非科技有限公司(wfdot.com)
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SumiaAccountBook.DataAccess
{
    public static class DaCashFlow
    {
        /// <summary>
        /// 查询收入总和
        /// </summary>
        /// <returns></returns>
        public static decimal GetTotal(int accountBookId,int type,int category,DateTime startDate,DateTime endDate,
            int projectId,int staffId)
        {
            using (CommonContext<Entity.CashFlow> db = new CommonContext<Entity.CashFlow>())
            {
                var records = db.All;

                //根据查询条件拼lamda表达式
                var query = records.AsQueryable();
                if (accountBookId>0)
                {
                    query = query.Where(r => r.AccountBookId == accountBookId);
                }
                if (0!=type)
                {
                    query = query.Where(r => r.Type == type);
                }
                if (category > 0)
                {
                    query = query.Where(r => r.Category == category);
                }
                if (null != startDate && startDate!=DateTime.MinValue)
                {
                    query = query.Where(r => r.Date >= startDate);
                }
                if (null != endDate && endDate != DateTime.MinValue)
                {
                    query = query.Where(r => r.Date <= endDate);
                }
                if (projectId>0)
                {
                    query = query.Where(r => r.ProjectId == projectId);
                }
                if (staffId > 0)
                {
                    query = query.Where(r => r.StaffId == staffId);
                }

                //return query.Sum(r => r.Amount);  //这句话在只查员工时会报错，很奇怪
                var result = query.ToList();
                return result.Sum(r => r.Amount);                
            }
        }

        public static List<Entity.CashFlow> GetList(int pageIndex, int pageSize,
            int accountBookId, int type, int category, DateTime startDate, DateTime endDate,
            int projectId, int staffId,ref int total)
        {

            using (CommonContext<Entity.CashFlow> db = new CommonContext<Entity.CashFlow>())
            {
                var records = db.All;

                //根据查询条件拼lamda表达式
                var query = records.AsQueryable();
                if (accountBookId > 0)
                {
                    query = query.Where(r => r.AccountBookId == accountBookId);
                }
                if (0 != type)
                {
                    query = query.Where(r => r.Type == type);
                }
                if (category > 0)
                {
                    query = query.Where(r => r.Category == category);
                }
                if (null != startDate && startDate != DateTime.MinValue)
                {
                    query = query.Where(r => r.Date >= startDate);
                }
                if (null != endDate && endDate != DateTime.MinValue)
                {
                    query = query.Where(r => r.Date <= endDate);
                }
                if (projectId > 0)
                {
                    query = query.Where(r => r.ProjectId == projectId);
                }
                if (staffId > 0)
                {
                    query = query.Where(r => r.StaffId == staffId);
                }

                total = query.Count();
                query = query.OrderByDescending(r => r.Date).Skip(pageSize * (pageIndex - 1)).Take(pageSize);
                return query.ToList();
            }
        }

        public static List<Entity.CashFlow> GetStaffList(int accountBookId, DateTime startDate, DateTime endDate)
        {
            using (CommonContext<Entity.CashFlow> db = new CommonContext<Entity.CashFlow>())
            {
                var records = db.All;

                //根据查询条件拼lamda表达式
                var query = records.AsQueryable();
                query=query.Where(r => r.StaffId > 0);
                if (accountBookId > 0)
                {
                    query = query.Where(r => r.AccountBookId == accountBookId);
                }                             
                if (null != startDate && startDate != DateTime.MinValue)
                {
                    query = query.Where(r => r.Date >= startDate);
                }
                if (null != endDate && endDate != DateTime.MinValue)
                {
                    query = query.Where(r => r.Date <= endDate);
                }                
                
                return query.ToList();
            }
        }

        public static List<Entity.CashFlow> GetList(int accountBookId, DateTime startDate, DateTime endDate)
        {
            using (CommonContext<Entity.CashFlow> db = new CommonContext<Entity.CashFlow>())
            {
                var records = db.All;

                //根据查询条件拼lamda表达式
                var query = records.AsQueryable();                
                if (accountBookId > 0)
                {
                    query = query.Where(r => r.AccountBookId == accountBookId);
                }
                if (null != startDate && startDate != DateTime.MinValue)
                {
                    query = query.Where(r => r.Date >= startDate);
                }
                if (null != endDate && endDate != DateTime.MinValue)
                {
                    query = query.Where(r => r.Date <= endDate);
                }

                return query.OrderBy(r=>r.Date).ToList();
            }
        }

        public static List<Entity.CashFlow> GetListShared(int accountBookId, DateTime startDate, DateTime endDate)
        {
            using (CommonContext<Entity.CashFlow> db = new CommonContext<Entity.CashFlow>())
            {
                var records = db.All;

                //根据查询条件拼lamda表达式
                var query = records.AsQueryable();
                query = query.Where(r => r.ProjectId < 0 && r.StaffId < 0);
                if (accountBookId > 0)
                {
                    query = query.Where(r => r.AccountBookId == accountBookId);
                }
                if (null != startDate && startDate != DateTime.MinValue)
                {
                    query = query.Where(r => r.Date >= startDate);
                }
                if (null != endDate && endDate != DateTime.MinValue)
                {
                    query = query.Where(r => r.Date <= endDate);
                }

                return query.OrderBy(r => r.Date).ToList();
            }
        }
    }
}
